/*
 * Copyright (c) 2015, Luca Fulchir<luca@fulchir.it>, All rights reserved.
 *
 * This file is part of "libRaptorQ".
 *
 * libRaptorQ is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3
 * of the License, or (at your option) any later version.
 *
 * libRaptorQ is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * and a copy of the GNU Lesser General Public License
 * along with libRaptorQ.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef RAPTORQ_TABLE2_HPP
#define RAPTORQ_TABLE2_HPP

#include <cstdint>
#include <tuple>
#include <array>

namespace RaptorQ {
namespace Impl {

#ifdef USING_CLANG
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmissing-braces"
#pragma clang diagnostic ignored "-Wglobal-constructors"
#pragma clang diagnostic ignored "-Wexit-time-destructors"
#endif	//using_clang

// I know, I know. Not exactly 80 colums. You format this, it's just the
// 3 tables from RFC6330, pages 41-62

static const std::array<uint16_t, 477> K_padded = {10, 12, 18, 20, 26, 30, 32, 36, 42, 46, 48, 49, 55, 60, 62, 69, 75, 84, 88, 91, 95, 97, 101, 114, 119, 125, 127, 138, 140, 149, 153, 160, 166, 168, 179, 181, 185, 187, 200, 213, 217, 225, 236, 242, 248, 257, 263, 269, 280, 295, 301, 305, 324, 337, 341, 347, 355, 362, 368, 372, 380, 385, 393, 405, 418, 428, 434, 447, 453, 466, 478, 486, 491, 497, 511, 526, 532, 542, 549, 557, 563, 573, 580, 588, 594, 600, 606, 619, 633, 640, 648, 666, 675, 685, 693, 703, 718, 728, 736, 747, 759, 778, 792, 802, 811, 821, 835, 845, 860, 870, 891, 903, 913, 926, 938, 950, 963, 977, 989, 1002, 1020, 1032, 1050, 1074, 1085, 1099, 1111, 1136, 1152, 1169, 1183, 1205, 1220, 1236, 1255, 1269, 1285, 1306, 1347, 1361, 1389, 1404, 1420, 1436, 1461, 1477, 1502, 1522, 1539, 1561, 1579, 1600, 1616, 1649, 1673, 1698, 1716, 1734, 1759, 1777, 1800, 1824, 1844, 1863, 1887, 1906, 1926, 1954, 1979, 2005, 2040, 2070, 2103, 2125, 2152, 2195, 2217, 2247, 2278, 2315, 2339, 2367, 2392, 2416, 2447, 2473, 2502, 2528, 2565, 2601, 2640, 2668, 2701, 2737, 2772, 2802, 2831, 2875, 2906, 2938, 2979, 3015, 3056, 3101, 3151, 3186, 3224, 3265, 3299, 3344, 3387, 3423, 3466, 3502, 3539, 3579, 3616, 3658, 3697, 3751, 3792, 3840, 3883, 3924, 3970, 4015, 4069, 4112, 4165, 4207, 4252, 4318, 4365, 4418, 4468, 4513, 4567, 4626, 4681, 4731, 4780, 4838, 4901, 4954, 5008, 5063, 5116, 5172, 5225, 5279, 5334, 5391, 5449, 5506, 5566, 5637, 5694, 5763, 5823, 5896, 5975, 6039, 6102, 6169, 6233, 6296, 6363, 6427, 6518, 6589, 6655, 6730, 6799, 6878, 6956, 7033, 7108, 7185, 7281, 7360, 7445, 7520, 7596, 7675, 7770, 7855, 7935, 8030, 8111, 8194, 8290, 8377, 8474, 8559, 8654, 8744, 8837, 8928, 9019, 9111, 9206, 9303, 9400, 9497, 9601, 9708, 9813, 9916, 10017, 10120, 10241, 10351, 10458, 10567, 10676, 10787, 10899, 11015, 11130, 11245, 11358, 11475, 11590, 11711, 11829, 11956, 12087, 12208, 12333, 12460, 12593, 12726, 12857, 13002, 13143, 13284, 13417, 13558, 13695, 13833, 13974, 14115, 14272, 14415, 14560, 14713, 14862, 15011, 15170, 15325, 15496, 15651, 15808, 15977, 16161, 16336, 16505, 16674, 16851, 17024, 17195, 17376, 17559, 17742, 17929, 18116, 18309, 18503, 18694, 18909, 19126, 19325, 19539, 19740, 19939, 20152, 20355, 20564, 20778, 20988, 21199, 21412, 21629, 21852, 22073, 22301, 22536, 22779, 23010, 23252, 23491, 23730, 23971, 24215, 24476, 24721, 24976, 25230, 25493, 25756, 26022, 26291, 26566, 26838, 27111, 27392, 27682, 27959, 28248, 28548, 28845, 29138, 29434, 29731, 30037, 30346, 30654, 30974, 31285, 31605, 31948, 32272, 32601, 32932, 33282, 33623, 33961, 34302, 34654, 35031, 35395, 35750, 36112, 36479, 36849, 37227, 37606, 37992, 38385, 38787, 39176, 39576, 39980, 40398, 40816, 41226, 41641, 42067, 42490, 42916, 43388, 43840, 44279, 44729, 45183, 45638, 46104, 46574, 47047, 47523, 48007, 48489, 48976, 49470, 49978, 50511, 51017, 51530, 52062, 52586, 53114, 53650, 54188, 54735, 55289, 55843, 56403};

static const uint16_t K_max = K_padded[476];

static const std::array<uint16_t, 477> J_K_padded = {254,630,682,293,80,566,860,267,822,506,589,87,520,159,235,157,502,334,583,66,352,365,562,5,603,721,28,660,829,900,930,814,661,693,780,605,551,777,491,396,764,843,646,557,608,265,505,722,263,999,874,160,575,210,513,503,558,932,404,520,846,485,728,554,471,641,732,193,934,864,790,912,617,587,800,923,998,92,497,559,667,912,262,152,526,268,212,45,898,527,558,460,5,895,996,282,513,865,870,239,452,862,852,643,543,447,321,287,12,251,30,621,555,127,400,91,916,935,691,299,282,824,536,596,28,947,162,536,1000,251,673,559,923,81,478,198,137,75,29,231,532,58,60,964,624,502,636,986,950,735,866,203,83,14,522,226,282,88,636,860,324,424,999,682,814,979,538,278,580,773,911,506,628,282,309,858,442,654,82,428,442,283,538,189,438,912,1,167,272,209,927,386,653,669,431,793,588,777,939,864,627,265,976,988,507,640,15,667,24,877,240,720,93,919,635,174,647,820,56,485,210,124,546,954,262,927,957,726,583,782,37,758,777,104,476,113,313,102,501,332,786,99,658,794,37,471,94,873,918,945,211,341,11,578,494,694,252,451,83,689,488,214,17,469,263,309,984,123,360,863,122,522,539,181,64,387,967,843,999,76,142,599,576,176,392,332,291,913,608,212,696,931,326,228,706,144,83,743,187,654,359,493,369,981,276,647,389,80,396,580,873,15,976,584,267,876,642,794,78,736,882,251,434,204,256,106,375,148,496,88,826,71,925,760,130,641,400,480,76,665,910,467,964,625,362,759,728,343,113,137,308,800,177,961,958,72,732,145,577,305,50,351,175,727,902,409,776,586,451,287,246,222,563,839,897,409,618,439,95,448,133,938,423,90,640,922,250,367,447,559,121,623,450,253,106,863,148,427,138,794,247,562,53,135,21,201,169,70,386,226,3,769,590,672,713,967,368,348,119,503,181,394,189,210,62,273,554,936,483,397,241,500,12,958,524,8,100,339,804,510,18,412,394,830,535,199,27,298,368,755,379,73,387,457,761,855,370,261,299,920,269,862,349,103,115,93,982,432,340,173,421,330,624,233,362,963,471};

static const std::array<std::tuple<uint16_t, uint16_t, uint16_t>, 477> S_H_W = {std::make_tuple(7, 10, 17), std::make_tuple(7, 10, 19), std::make_tuple(11, 10, 29), std::make_tuple(11, 10, 31), std::make_tuple(11, 10, 37), std::make_tuple(11, 10, 41), std::make_tuple(11, 10, 43), std::make_tuple(11, 10, 47), std::make_tuple(11, 10, 53), std::make_tuple(13, 10, 59), std::make_tuple(13, 10, 61), std::make_tuple(13, 10, 61), std::make_tuple(13, 10, 67), std::make_tuple(13, 10, 71), std::make_tuple(13, 10, 73), std::make_tuple(13, 10, 79), std::make_tuple(17, 10, 89), std::make_tuple(17, 10, 97), std::make_tuple(17, 10, 101), std::make_tuple(17, 10, 103), std::make_tuple(17, 10, 107), std::make_tuple(17, 10, 109), std::make_tuple(17, 10, 113), std::make_tuple(19, 10, 127), std::make_tuple(19, 10, 131), std::make_tuple(19, 10, 137), std::make_tuple(19, 10, 139), std::make_tuple(19, 10, 149), std::make_tuple(19, 10, 151), std::make_tuple(23, 10, 163), std::make_tuple(23, 10, 167), std::make_tuple(23, 10, 173), std::make_tuple(23, 10, 179), std::make_tuple(23, 10, 181), std::make_tuple(23, 10, 191), std::make_tuple(23, 10, 193), std::make_tuple(23, 10, 197), std::make_tuple(23, 10, 199), std::make_tuple(23, 10, 211), std::make_tuple(23, 10, 223), std::make_tuple(29, 10, 233), std::make_tuple(29, 10, 241), std::make_tuple(29, 10, 251), std::make_tuple(29, 10, 257), std::make_tuple(29, 10, 263), std::make_tuple(29, 10, 271), std::make_tuple(29, 10, 277), std::make_tuple(29, 10, 283), std::make_tuple(29, 10, 293), std::make_tuple(29, 10, 307), std::make_tuple(29, 10, 313), std::make_tuple(29, 10, 317), std::make_tuple(31, 10, 337), std::make_tuple(31, 10, 349), std::make_tuple(31, 10, 353), std::make_tuple(31, 10, 359), std::make_tuple(31, 10, 367), std::make_tuple(31, 10, 373), std::make_tuple(31, 10, 379), std::make_tuple(37, 10, 389), std::make_tuple(37, 10, 397), std::make_tuple(37, 10, 401), std::make_tuple(37, 10, 409), std::make_tuple(37, 10, 421), std::make_tuple(37, 10, 433), std::make_tuple(37, 10, 443), std::make_tuple(37, 10, 449), std::make_tuple(37, 10, 461), std::make_tuple(37, 10, 467), std::make_tuple(37, 10, 479), std::make_tuple(37, 10, 491), std::make_tuple(37, 10, 499), std::make_tuple(37, 10, 503), std::make_tuple(37, 10, 509), std::make_tuple(37, 10, 523), std::make_tuple(41, 10, 541), std::make_tuple(41, 10, 547), std::make_tuple(41, 10, 557), std::make_tuple(41, 10, 563), std::make_tuple(41, 10, 571), std::make_tuple(41, 10, 577), std::make_tuple(41, 10, 587), std::make_tuple(41, 10, 593), std::make_tuple(41, 10, 601), std::make_tuple(41, 10, 607), std::make_tuple(41, 10, 613), std::make_tuple(41, 10, 619), std::make_tuple(41, 10, 631), std::make_tuple(43, 10, 647), std::make_tuple(43, 10, 653), std::make_tuple(43, 10, 661), std::make_tuple(47, 10, 683), std::make_tuple(47, 10, 691), std::make_tuple(47, 10, 701), std::make_tuple(47, 10, 709), std::make_tuple(47, 10, 719), std::make_tuple(47, 10, 733), std::make_tuple(47, 10, 743), std::make_tuple(47, 10, 751), std::make_tuple(47, 10, 761), std::make_tuple(47, 10, 773), std::make_tuple(53, 10, 797), std::make_tuple(53, 10, 811), std::make_tuple(53, 10, 821), std::make_tuple(53, 10, 829), std::make_tuple(53, 10, 839), std::make_tuple(53, 10, 853), std::make_tuple(53, 10, 863), std::make_tuple(53, 10, 877), std::make_tuple(53, 10, 887), std::make_tuple(53, 10, 907), std::make_tuple(53, 10, 919), std::make_tuple(53, 10, 929), std::make_tuple(53, 10, 941), std::make_tuple(53, 10, 953), std::make_tuple(59, 10, 971), std::make_tuple(59, 10, 983), std::make_tuple(59, 10, 997), std::make_tuple(59, 10, 1009), std::make_tuple(59, 10, 1021), std::make_tuple(59, 10, 1039), std::make_tuple(59, 10, 1051), std::make_tuple(59, 11, 1069), std::make_tuple(59, 11, 1093), std::make_tuple(59, 11, 1103), std::make_tuple(59, 11, 1117), std::make_tuple(59, 11, 1129), std::make_tuple(59, 11, 1153), std::make_tuple(61, 11, 1171), std::make_tuple(61, 11, 1187), std::make_tuple(61, 11, 1201), std::make_tuple(61, 11, 1223), std::make_tuple(61, 11, 1237), std::make_tuple(67, 11, 1259), std::make_tuple(67, 11, 1277), std::make_tuple(67, 11, 1291), std::make_tuple(67, 11, 1307), std::make_tuple(67, 11, 1327), std::make_tuple(67, 11, 1367), std::make_tuple(67, 11, 1381), std::make_tuple(67, 11, 1409), std::make_tuple(67, 11, 1423), std::make_tuple(67, 11, 1439), std::make_tuple(71, 11, 1459), std::make_tuple(71, 11, 1483), std::make_tuple(71, 11, 1499), std::make_tuple(71, 11, 1523), std::make_tuple(71, 11, 1543), std::make_tuple(71, 11, 1559), std::make_tuple(73, 11, 1583), std::make_tuple(73, 11, 1601), std::make_tuple(73, 11, 1621), std::make_tuple(73, 11, 1637), std::make_tuple(73, 11, 1669), std::make_tuple(79, 11, 1699), std::make_tuple(79, 11, 1723), std::make_tuple(79, 11, 1741), std::make_tuple(79, 11, 1759), std::make_tuple(79, 11, 1783), std::make_tuple(79, 11, 1801), std::make_tuple(79, 11, 1823), std::make_tuple(79, 11, 1847), std::make_tuple(79, 11, 1867), std::make_tuple(83, 11, 1889), std::make_tuple(83, 11, 1913), std::make_tuple(83, 11, 1931), std::make_tuple(83, 11, 1951), std::make_tuple(83, 11, 1979), std::make_tuple(83, 11, 2003), std::make_tuple(83, 11, 2029), std::make_tuple(89, 11, 2069), std::make_tuple(89, 11, 2099), std::make_tuple(89, 11, 2131), std::make_tuple(89, 11, 2153), std::make_tuple(89, 11, 2179), std::make_tuple(89, 11, 2221), std::make_tuple(89, 11, 2243), std::make_tuple(89, 11, 2273), std::make_tuple(97, 11, 2311), std::make_tuple(97, 11, 2347), std::make_tuple(97, 11, 2371), std::make_tuple(97, 11, 2399), std::make_tuple(97, 11, 2423), std::make_tuple(97, 11, 2447), std::make_tuple(97, 11, 2477), std::make_tuple(97, 11, 2503), std::make_tuple(97, 11, 2531), std::make_tuple(97, 11, 2557), std::make_tuple(97, 11, 2593), std::make_tuple(101, 11, 2633), std::make_tuple(101, 11, 2671), std::make_tuple(101, 11, 2699), std::make_tuple(101, 11, 2731), std::make_tuple(101, 11, 2767), std::make_tuple(101, 11, 2801), std::make_tuple(103, 11, 2833), std::make_tuple(103, 11, 2861), std::make_tuple(107, 11, 2909), std::make_tuple(107, 11, 2939), std::make_tuple(107, 11, 2971), std::make_tuple(107, 11, 3011), std::make_tuple(109, 11, 3049), std::make_tuple(109, 11, 3089), std::make_tuple(113, 11, 3137), std::make_tuple(113, 11, 3187), std::make_tuple(113, 11, 3221), std::make_tuple(113, 11, 3259), std::make_tuple(113, 11, 3299), std::make_tuple(127, 11, 3347), std::make_tuple(127, 11, 3391), std::make_tuple(127, 11, 3433), std::make_tuple(127, 11, 3469), std::make_tuple(127, 11, 3511), std::make_tuple(127, 11, 3547), std::make_tuple(127, 11, 3583), std::make_tuple(127, 11, 3623), std::make_tuple(127, 11, 3659), std::make_tuple(127, 11, 3701), std::make_tuple(127, 11, 3739), std::make_tuple(127, 11, 3793), std::make_tuple(127, 11, 3833), std::make_tuple(127, 11, 3881), std::make_tuple(127, 11, 3923), std::make_tuple(131, 11, 3967), std::make_tuple(131, 11, 4013), std::make_tuple(131, 11, 4057), std::make_tuple(131, 11, 4111), std::make_tuple(137, 11, 4159), std::make_tuple(137, 11, 4211), std::make_tuple(137, 11, 4253), std::make_tuple(137, 11, 4297), std::make_tuple(137, 11, 4363), std::make_tuple(137, 11, 4409), std::make_tuple(139, 11, 4463), std::make_tuple(139, 11, 4513), std::make_tuple(149, 11, 4567), std::make_tuple(149, 11, 4621), std::make_tuple(149, 11, 4679), std::make_tuple(149, 11, 4733), std::make_tuple(149, 11, 4783), std::make_tuple(149, 11, 4831), std::make_tuple(149, 11, 4889), std::make_tuple(149, 11, 4951), std::make_tuple(149, 11, 5003), std::make_tuple(151, 11, 5059), std::make_tuple(151, 11, 5113), std::make_tuple(157, 11, 5171), std::make_tuple(157, 11, 5227), std::make_tuple(157, 11, 5279), std::make_tuple(157, 11, 5333), std::make_tuple(157, 11, 5387), std::make_tuple(157, 11, 5443), std::make_tuple(163, 11, 5507), std::make_tuple(163, 11, 5563), std::make_tuple(163, 11, 5623), std::make_tuple(163, 11, 5693), std::make_tuple(163, 11, 5749), std::make_tuple(167, 11, 5821), std::make_tuple(167, 11, 5881), std::make_tuple(167, 11, 5953), std::make_tuple(173, 11, 6037), std::make_tuple(173, 11, 6101), std::make_tuple(173, 11, 6163), std::make_tuple(173, 11, 6229), std::make_tuple(179, 11, 6299), std::make_tuple(179, 11, 6361), std::make_tuple(179, 11, 6427), std::make_tuple(179, 11, 6491), std::make_tuple(179, 11, 6581), std::make_tuple(181, 11, 6653), std::make_tuple(181, 11, 6719), std::make_tuple(191, 11, 6803), std::make_tuple(191, 11, 6871), std::make_tuple(191, 11, 6949), std::make_tuple(191, 11, 7027), std::make_tuple(191, 11, 7103), std::make_tuple(191, 11, 7177), std::make_tuple(191, 11, 7253), std::make_tuple(193, 11, 7351), std::make_tuple(197, 11, 7433), std::make_tuple(197, 11, 7517), std::make_tuple(197, 11, 7591), std::make_tuple(199, 11, 7669), std::make_tuple(211, 11, 7759), std::make_tuple(211, 11, 7853), std::make_tuple(211, 11, 7937), std::make_tuple(211, 11, 8017), std::make_tuple(211, 11, 8111), std::make_tuple(211, 11, 8191), std::make_tuple(211, 11, 8273), std::make_tuple(211, 11, 8369), std::make_tuple(223, 11, 8467), std::make_tuple(223, 11, 8563), std::make_tuple(223, 11, 8647), std::make_tuple(223, 11, 8741), std::make_tuple(223, 11, 8831), std::make_tuple(223, 11, 8923), std::make_tuple(223, 11, 9013), std::make_tuple(223, 11, 9103), std::make_tuple(227, 11, 9199), std::make_tuple(227, 11, 9293), std::make_tuple(229, 11, 9391), std::make_tuple(233, 11, 9491), std::make_tuple(233, 11, 9587), std::make_tuple(239, 11, 9697), std::make_tuple(239, 11, 9803), std::make_tuple(239, 11, 9907), std::make_tuple(239, 11, 10009), std::make_tuple(241, 11, 10111), std::make_tuple(251, 11, 10223), std::make_tuple(251, 11, 10343), std::make_tuple(251, 11, 10453), std::make_tuple(251, 11, 10559), std::make_tuple(251, 11, 10667), std::make_tuple(257, 11, 10781), std::make_tuple(257, 11, 10891), std::make_tuple(257, 12, 11003), std::make_tuple(257, 12, 11119), std::make_tuple(263, 12, 11239), std::make_tuple(263, 12, 11353), std::make_tuple(269, 12, 11471), std::make_tuple(269, 12, 11587), std::make_tuple(269, 12, 11701), std::make_tuple(269, 12, 11821), std::make_tuple(271, 12, 11941), std::make_tuple(277, 12, 12073), std::make_tuple(277, 12, 12203), std::make_tuple(277, 12, 12323), std::make_tuple(281, 12, 12451), std::make_tuple(281, 12, 12577), std::make_tuple(293, 12, 12721), std::make_tuple(293, 12, 12853), std::make_tuple(293, 12, 12983), std::make_tuple(293, 12, 13127), std::make_tuple(293, 12, 13267), std::make_tuple(307, 12, 13421), std::make_tuple(307, 12, 13553), std::make_tuple(307, 12, 13693), std::make_tuple(307, 12, 13829), std::make_tuple(307, 12, 13967), std::make_tuple(307, 12, 14107), std::make_tuple(311, 12, 14251), std::make_tuple(311, 12, 14407), std::make_tuple(313, 12, 14551), std::make_tuple(317, 12, 14699), std::make_tuple(317, 12, 14851), std::make_tuple(331, 12, 15013), std::make_tuple(331, 12, 15161), std::make_tuple(331, 12, 15319), std::make_tuple(331, 12, 15473), std::make_tuple(331, 12, 15643), std::make_tuple(337, 12, 15803), std::make_tuple(337, 12, 15959), std::make_tuple(337, 12, 16127), std::make_tuple(347, 12, 16319), std::make_tuple(347, 12, 16493), std::make_tuple(347, 12, 16661), std::make_tuple(349, 12, 16831), std::make_tuple(353, 12, 17011), std::make_tuple(353, 12, 17183), std::make_tuple(359, 12, 17359), std::make_tuple(359, 12, 17539), std::make_tuple(367, 12, 17729), std::make_tuple(367, 12, 17911), std::make_tuple(367, 12, 18097), std::make_tuple(373, 12, 18289), std::make_tuple(373, 12, 18481), std::make_tuple(379, 12, 18679), std::make_tuple(379, 12, 18869), std::make_tuple(383, 12, 19087), std::make_tuple(389, 12, 19309), std::make_tuple(389, 12, 19507), std::make_tuple(397, 12, 19727), std::make_tuple(397, 12, 19927), std::make_tuple(401, 12, 20129), std::make_tuple(401, 12, 20341), std::make_tuple(409, 12, 20551), std::make_tuple(409, 12, 20759), std::make_tuple(419, 13, 20983), std::make_tuple(419, 13, 21191), std::make_tuple(419, 13, 21401), std::make_tuple(419, 13, 21613), std::make_tuple(431, 13, 21841), std::make_tuple(431, 13, 22063), std::make_tuple(431, 13, 22283), std::make_tuple(433, 13, 22511), std::make_tuple(439, 13, 22751), std::make_tuple(439, 13, 22993), std::make_tuple(443, 13, 23227), std::make_tuple(449, 13, 23473), std::make_tuple(457, 13, 23719), std::make_tuple(457, 13, 23957), std::make_tuple(457, 13, 24197), std::make_tuple(461, 13, 24443), std::make_tuple(467, 13, 24709), std::make_tuple(467, 13, 24953), std::make_tuple(479, 13, 25219), std::make_tuple(479, 13, 25471), std::make_tuple(479, 13, 25733), std::make_tuple(487, 13, 26003), std::make_tuple(487, 13, 26267), std::make_tuple(491, 13, 26539), std::make_tuple(499, 13, 26821), std::make_tuple(499, 13, 27091), std::make_tuple(503, 13, 27367), std::make_tuple(509, 13, 27653), std::make_tuple(521, 13, 27953), std::make_tuple(521, 13, 28229), std::make_tuple(521, 13, 28517), std::make_tuple(523, 13, 28817), std::make_tuple(541, 13, 29131), std::make_tuple(541, 13, 29423), std::make_tuple(541, 13, 29717), std::make_tuple(541, 13, 30013), std::make_tuple(547, 13, 30323), std::make_tuple(547, 13, 30631), std::make_tuple(557, 14, 30949), std::make_tuple(557, 14, 31267), std::make_tuple(563, 14, 31583), std::make_tuple(569, 14, 31907), std::make_tuple(571, 14, 32251), std::make_tuple(577, 14, 32579), std::make_tuple(587, 14, 32917), std::make_tuple(587, 14, 33247), std::make_tuple(593, 14, 33601), std::make_tuple(593, 14, 33941), std::make_tuple(599, 14, 34283), std::make_tuple(607, 14, 34631), std::make_tuple(607, 14, 34981), std::make_tuple(613, 14, 35363), std::make_tuple(619, 14, 35731), std::make_tuple(631, 14, 36097), std::make_tuple(631, 14, 36457), std::make_tuple(641, 14, 36833), std::make_tuple(641, 14, 37201), std::make_tuple(643, 14, 37579), std::make_tuple(653, 14, 37967), std::make_tuple(653, 14, 38351), std::make_tuple(659, 14, 38749), std::make_tuple(673, 14, 39163), std::make_tuple(673, 14, 39551), std::make_tuple(677, 14, 39953), std::make_tuple(683, 14, 40361), std::make_tuple(691, 15, 40787), std::make_tuple(701, 15, 41213), std::make_tuple(701, 15, 41621), std::make_tuple(709, 15, 42043), std::make_tuple(709, 15, 42467), std::make_tuple(719, 15, 42899), std::make_tuple(727, 15, 43331), std::make_tuple(727, 15, 43801), std::make_tuple(733, 15, 44257), std::make_tuple(739, 15, 44701), std::make_tuple(751, 15, 45161), std::make_tuple(751, 15, 45613), std::make_tuple(757, 15, 46073), std::make_tuple(769, 15, 46549), std::make_tuple(769, 15, 47017), std::make_tuple(787, 15, 47507), std::make_tuple(787, 15, 47981), std::make_tuple(787, 15, 48463), std::make_tuple(797, 15, 48953), std::make_tuple(809, 15, 49451), std::make_tuple(809, 15, 49943), std::make_tuple(821, 15, 50461), std::make_tuple(821, 16, 50993), std::make_tuple(827, 16, 51503), std::make_tuple(839, 16, 52027), std::make_tuple(853, 16, 52571), std::make_tuple(853, 16, 53093), std::make_tuple(857, 16, 53623), std::make_tuple(863, 16, 54163), std::make_tuple(877, 16, 54713), std::make_tuple(877, 16, 55259), std::make_tuple(883, 16, 55817), std::make_tuple(907, 16, 56393), std::make_tuple(907, 16, 56951)};

#ifdef USING_CLANG
#pragma clang diagnostic pop
#endif	//using_clang

}	// namespace Impl
}	// namespace RaptorQ

#endif

